import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.StringTokenizer;

public class GiaTriTrongMang {
	private static int m, n;
	private static int[][] arr;

	/**
	 * @param args
	 */
	static void readFile() {
		Scanner sc;
		try {
			sc = new Scanner(new File("F:/maTran.txt"));
			// read each line of text file
			m = sc.nextInt();
			n = sc.nextInt();
			arr = new int[m][n];
			int row = 0;
			while (row < m) {
				int cot = 0;
				while (cot < n) {
					// get next token and store it in the array
					arr[row][cot] = sc.nextInt();
					;
					cot++;
				}
				cot = 0;
				row++;
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/* Phương thức tìm kiếm */
	static int intViTri(int key, int[][] arrX, int dong, int left, int right) {
		int low = left, high = right, mid = (low + high) / 2;
		while (low <= high) {

			mid = (low + high) / 2; // Chỉ số giữa
			if (key > arrX[dong][mid])
				low = mid + 1; // Tìm nửa sau
			else if (key < arrX[dong][mid])
				high = mid - 1; // Tìm nửa đầu
			else
				return mid; // Tìm thấy
		}
		return mid; // Không tìm thấy
	}

	static int intViTri1Chieu(int key, int[] arrX, int left, int right) {
		int low = left, high = right, mid = (low + high) / 2;
		while (low <= high) {

			mid = (low + high) / 2; // Chỉ số giữa
			if (key > arrX[mid])
				low = mid + 1; // Tìm nửa sau
			else if (key < arrX[mid])
				high = mid - 1; // Tìm nửa đầu
			else
				return mid; // Tìm thấy
		}
		return mid;
	}

	static boolean search(int key, int[][] arrX, int dong) {
		int low = 0, hight = n - 1, mid;
		while (low <= hight) {

			mid = (low + hight) / 2; // Chỉ số giữa
			if (key > arrX[dong][mid])
				low = mid + 1; // Tìm nửa sau
			else if (key < arrX[dong][mid])
				hight = mid - 1; // Tìm nửa đầu
			else
				return true; // Tìm thấy
		}
		return false; // Không tìm thấy
	}

	public static void main(String[] args) {

		readFile();
		int[] temp = new int[n];
		int dem = 0;
		boolean flag = false;
		// So sánh 2 dòng đầu tiên
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (arr[0][i] == arr[1][j]) {
					temp[dem] = arr[0][i];
					dem++;
					flag = true;
				}
			}
		}
		int maxTemp = dem;
		if (!flag) {
			System.out.println("NO");
			return;
		}
		// So sanh cac dong con lai
		int dong = 2;
		flag = true;
		do {
			int demPT = 0;
			int left = 0,right = n-1;
			int[] tempArr = null;
			if(maxTemp > 3){
				left = intViTri1Chieu(arr[dong][0], temp, 0, maxTemp-1);
				tempArr = new int[maxTemp];
				if(left > 0){
					left--;
					maxTemp = maxTemp - left;
					int j = 0;
					
					for(int i = left;i< maxTemp;i++){
						tempArr[j] = temp[i];
						j++;
					}
					temp = new int[maxTemp];
					temp = tempArr;
				}
			}
			else{
				tempArr = new int[maxTemp];
			}
			// So phan tu bi loai;
			if (maxTemp > 1) {
				int i = 0;
				int viTriMid;
				while (i < maxTemp) {

					viTriMid = intViTri(temp[i], arr, dong, left, right);

					System.out.println(maxTemp + " " + i + " " + dong + " " + viTriMid);
					// Lay vi tri mid gan voi gia tri thu i cua mang nhat
					while (temp[i] > arr[dong][viTriMid] && viTriMid < n) {
						viTriMid++;
						System.out.println("Vi tri mid" + viTriMid + " temp i" + temp[i]); 
					}
					// Tim thay gia tri tempArr[i] o vi Tri mid
					if (temp[i] == arr[dong][viTriMid]) {
						tempArr[demPT] = temp[i];
						demPT++;
						System.out.println(demPT + " "+ temp[i]);
					}
						left = viTriMid;
					
					i++;
				}
				maxTemp = demPT;
				if (demPT > 0) {
					temp = new int[demPT];
					for (int j = 0; j < demPT; j++) {
						temp[j] = tempArr[j];
					}
				} else {
					flag = false;
				}
			}
			// Chi co 1 phan tu trung
			else {
				if (!search(temp[0], arr, dong)) {
					flag = false;
				}
			}
			dong++;
		} while (flag && dong < m);
		if (!flag) {
			System.out.println("NO");
			return;
		} else {
			System.out.println("Tim thay!");
			for (int i = 0; i < maxTemp; i++) {
				System.out.print(temp[i] + "  ");
			}
		}
	}

}